package com.wxtwxt.ruralmall.search.thread;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 创建线程的四种方式
 * 1.继承Thread
 * 2.实现Runnable接口
 * 3.实现Callable接口
 * 4.使用线程池
 * 区别：
 *  1,2不能得到返回值，3可以获取返回值
 *  1,2,3不能控制资源
 *  4可以控制资源，性能稳定
 *
 *
 *  线程池：
 *  1.创建：①.Executors ②.new ThreadPoolExecutor()
 *
 * @author Wxt
 * @create 2023-04-14 14:20
 */
public class ThreadTest {
    public static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) {
        System.out.println("start...");
        CompletableFuture.runAsync(() -> {
            System.out.println("当前线程：" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果：" + i);
        }, fixedThreadPool);
        System.out.println("end...");
    }
    public static void testThreadPool(String[] args) {
        System.out.println("start...");
        // 将所有的多线程异步任务都交给线程池
        /**
         * 七大参数
         * 1.corePoolSize：     核心线程数(一直存在，除非设置[allowCoreThreadTimeOut])：线程池创建好以后就准备就绪的线程数量，就等待接收异步任务去执行
         * 2.maximumPoolSize：  最大线程数量，控制资源
         * 3.keepAliveTime：    存活时间，如果当前正在运行的线程数量大于核心数量，释放空闲的线程(maximumPoolSize - corePoolSize)
         * 4.unit:              时间单位
         * 5.workQueue：        阻塞队列，如果任务有很多，就会将目前多的任务防在队列里面，只要有线程空间，就会去队列中取出线程继续执行
         * 6.threadFactory：    线程创建工厂
         * 7.handler            队列满了，按照指定的拒绝策略拒绝执行任务
         */
        fixedThreadPool.execute(new Runable01());
        System.out.println("end...");
    }

    public static class Runable01 implements Runnable {

        @Override
        public void run() {
            System.out.println("当前线程：" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果：" + i);
        }
    }
}
